package kr.co.goodwilldd;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringEscapeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyHttpRequestWrapper extends HttpServletRequestWrapper {

	private static final Logger logger = LoggerFactory
			.getLogger(MyHttpRequestWrapper.class);

	public MyHttpRequestWrapper(HttpServletRequest request) {
		super(request);
		logger.info(">>>> MyHttpRequestWrapper");
	}

	private Map<String, String[]> escapedParametersValuesMap = new HashMap<String, String[]>();

	@Override
	public String getParameter(String name) {
		String[] escapedParameterValues = escapedParametersValuesMap.get(name);
		String escapedParameterValue = null;
		if (escapedParameterValues != null) {
			escapedParameterValue = escapedParameterValues[0];
		} else {
			String parameterValue = super.getParameter(name);
			logger.info(">> original : {}", parameterValue);
			// HTML transformation characters
			escapedParameterValue = org.springframework.web.util.HtmlUtils
					.htmlEscape(parameterValue);
			logger.info(">> escape html : {}", escapedParameterValue);
			// SQL injection characters
			escapedParameterValue = StringEscapeUtils
					.escapeSql(escapedParameterValue);
			logger.info(">> escape sql : {}", escapedParameterValue);
			escapedParametersValuesMap.put(name,
					new String[] { escapedParameterValue });
		}// end-else

		return escapedParameterValue;
	}

	@Override
	public String[] getParameterValues(String name) {
		String[] escapedParameterValues = escapedParametersValuesMap.get(name);
		String[] escapedResultParameterValue = null;
		if (escapedParameterValues == null) {
			String[] parametersValues = super.getParameterValues(name);
			if (parametersValues != null && parametersValues.length > 0) {
				escapedResultParameterValue = new String[parametersValues.length];

				for (int i = 0; i < parametersValues.length; i++) {
					String parameterValue = parametersValues[i];
					String escapedParameterValue = parameterValue;
					logger.info(">> original : {}", parameterValue);
					escapedParameterValue = org.springframework.web.util.HtmlUtils
							.htmlEscape(parameterValue);
					logger.info(">> escape html : {}", escapedParameterValue);
					escapedParameterValue = StringEscapeUtils
							.escapeSql(escapedParameterValue);
					logger.info(">> escape sql : {}", escapedParameterValue);
					escapedResultParameterValue[i] = escapedParameterValue;
				}

				escapedParametersValuesMap.put(name,
						escapedResultParameterValue);
			}
		}

		return escapedResultParameterValue;
	}

}
